#include "serialworker.h"
#include <QDebug>

SerialWorker::SerialWorker(QObject *parent) : QObject(parent) {
  serial = new QSerialPort(this); // 创建串口对象，指定父对象以便自动管理内存
  readTimer = new QTimer(this);   // 创建定时器对象

  // 连接定时器超时信号到请求协议槽函数
  connect(readTimer, &QTimer::timeout, this, &SerialWorker::requestProtocol);
}

SerialWorker::~SerialWorker() {
  stopReading(); // 停止读取
  if (serial->isOpen()) {
    serial->close(); // 关闭串口
  }
}

void SerialWorker::startReading() {
  // 配置串口参数
  serial->setPortName("/dev/ttySAC2");
  serial->setBaudRate(QSerialPort::Baud9600);
  serial->setDataBits(QSerialPort::Data8);
  serial->setParity(QSerialPort::NoParity);
  serial->setStopBits(QSerialPort::OneStop);
  serial->setFlowControl(QSerialPort::NoFlowControl);

  // 尝试打开串口
  if (serial->open(QIODevice::ReadWrite)) {
    emit statusMessage("chuan kou da kai cheng gong");
    // 连接串口数据可读信号到读取槽函数
    connect(serial, &QSerialPort::readyRead, this, &SerialWorker::read_rfid);
    readTimer->start(2000); // 启动定时器，500ms间隔
  } else {
    // 发送错误信号
    emit errorOccurred("wu fa da chuan kou: " + serial->errorString());
  }
}

void SerialWorker::stopReading() {
  readTimer->stop(); // 停止定时器
  if (serial->isOpen()) {
    serial->close(); // 关闭串口
  }
  emit statusMessage("RFID du qu ting zhi");
}

void SerialWorker::requestProtocol() {
  // 设计请求协议
  char Request[8] = {0};
  Request[0] = 0x07;
  Request[1] = 0x02;
  Request[2] = 0x41;
  Request[3] = 0x01;
  Request[4] = 0x52;
  unsigned char BCC = 0;

  // 计算BCC校验
  for (int i = 0; i < (Request[0] - 2); i++) {
    BCC ^= Request[i];
  }
  Request[5] = ~BCC; // 取反BCC
  Request[6] = 0x03;

  // 发送请求协议
  if (serial->isOpen()) {
    int size = serial->write(Request, 7);
    qDebug() << "fa song xie yi:" << size;
  }
}

void SerialWorker::read_rfid() {
  // 读取所有可用数据
  QByteArray arry = serial->readAll();
  qDebug() << "jie shou dao RFID lengh:" << arry.length();

  // 判断请求是否成功
  if (arry.size() >= 3 && arry.at(0) == 0x08 && arry.at(2) == 0x00) {
    qDebug() << "shou dao qing qiu xiang ying";

    // 设计防碰撞协议
    char Request[9] = {0};
    Request[0] = 0x08;
    Request[1] = 0x02;
    Request[2] = 0x42;
    Request[3] = 0x02;
    Request[4] = 0x93;
    Request[5] = 0x00;
    unsigned char BCC = 0;

    // 计算BCC校验
    for (int i = 0; i < (Request[0] - 2); i++) {
      BCC ^= Request[i];
    }
    Request[6] = ~BCC;
    Request[7] = 0x03;

    // 发送防碰撞协议
    if (serial->isOpen()) {
      int size = serial->write(Request, 8);
      qDebug() << "send pengzhuang qingqiu" << size;
    }

  } else {
    qDebug() << "jie shou qing qiu shi bai";
  }

  // 判断防碰撞请求是否成功
  if (arry.size() >= 8 && arry.at(0) == 0x0A && arry.at(2) == 0x00) {
    // 提取卡号
    num = QString("%1%2%3%4")
              .arg((int)arry.at(4))
              .arg((int)arry.at(5))
              .arg((int)arry.at(6))
              .arg((int)arry.at(7));

    qDebug() << "jian ce dao RFID:" << num;

    // 发射卡号检测信号
    emit rfidCardDetected(num);
  }
}

// void SerialWorker::read_rfid() {
//   // 读取所有可用数据
//   QByteArray arry = serial->readAll();
//   qDebug() << "jie shou dao RFID :" << arry.length();

//  // 判断请求是否成功
//  if (arry.size() >= 3 && arry.at(0) == 0x08 && arry.at(2) == 0x00) {
//    qDebug() << "received Request Successfully";

//    // 设计防碰撞协议
//    char Request[9] = {0};
//    Request[0] = 0x08;
//    Request[1] = 0x02;
//    Request[2] = 0x42;
//    Request[3] = 0x02;
//    Request[4] = 0x93;
//    Request[5] = 0x00;
//    unsigned char BCC = 0;

//    // 计算BCC校验
//    for (int i = 0; i < (Request[0] - 2); i++) {
//      BCC ^= Request[i];
//    }
//    Request[6] = ~BCC;
//    Request[7] = 0x03;

//    // 发送防碰撞协议
//    if (serial->isOpen()) {
//      int size = serial->write(Request, 8);
//      qDebug() << "Anti-Collision-send Request:" << size;
//    }

//  } else {
//    qDebug() << "recive Request fail";
//  }

//  // 判断防碰撞请求是否成功
//  if (arry.size() >= 8 && arry.at(0) == 0x0A && arry.at(2) == 0x00) {
//    // 提取卡号
//    num = QString("%1%2%3%4")
//              .arg((int)arry.at(4))
//              .arg((int)arry.at(5))
//              .arg((int)arry.at(6))
//              .arg((int)arry.at(7));

//    qDebug() << "jian ce dao RFID卡:" << num;

//    // 发射卡号检测信号
//    emit rfidCardDetected(num);
//  }
//}
